package locadora.model;

/**
 * Interface que possui os comportamentos de um Item disponível
 * para locação em uma Locadora
 * 
 * @author Leonardo Rocha Dias
 * @author Marccelo Augusto Selvaggio
 * @version 9.11-09
 * @see Filme
 * @see Jogo
 * @since 2009
 */
public interface ItemLocacao {

    /**
     * Devolve o nome do item
     * 
     * @return o nome
     */
    public String getNome();

    /**
     * Diz se o item está ou não disponível para locação
     *
     * @return disponibilidade
     */
    public boolean isDisponivel();

    /**
     * Permite alugar um item
     *
     * <p>
     *
     * Existem 2 modos de se fazer a locação:
     * 
     * Alugar dado o item: um item é devolvido, por exemplo, e deve-se saber
     * para qual cliente ele será encaminhado. Ou seja, dado um item,
     * para qual cliente ele irá? Caso seja nenhum, a resposta deve ser “null”.
     * </p>
     *
     * <p>
     * Alugar dado o cliente: um cliente quer alugar um item, deve descobrir
     * qual item ser encaminhado a ele. Ou seja, dado um cliente, qual item
     * deve-se alugar para ele? Caso seja nenhum, a resposta deve ser “null”.
     * </p>
     *
     * <p>
     * Observação
     * Cada cliente tem sua lista de titulos, em ordem de prioridade
     * Quando mais de um cliente quer o mesmo titulo na mesma prioridade,
     * então a ordem de chegada deles é que vale
     * Quando um item é locado ele deve ser retirado imediatamente da lista do cliente
     * Não há prazo para devolução dos itens, não é necessário tratar multas nem
     * preços e valores de locação.
     * </p>
     *
     * @return verdadeiro se o item pode ser alugado, ou falso caso contrário
     */
    public boolean alugar();

    /**
     * Permite devolver um item
     *
     * @return verdadeiro se o item pode ser devolvido, ou falso caso contrário
     */
    public boolean devolver();

    /**
     * Gera o codigo hash com base no código do cliente
     * utilizado para identificação em conjuntos
     * @return o codigo hash
     */
    @Override
    public int hashCode();

    /**
     * Devolve se o um cliente é igual a outro com base no nome do item
     * @param obj que representa um item
     * @return verdadeiro se o nome deste item for igual ao do item
     * recebido por parâmetro ou falso caso contrário, ou seja, se os nomes não
     * forem iguais
     */
    @Override
    public boolean equals(Object obj);

    /**
     * Representa a string do objeto Item
     * @return uma string contendo informações do Item
     */
    @Override
    public String toString();

}
